LinuC-2 - 201試験 - 2.01:システムの起動とLinuxカーネル - 2.01.3 Linux カーネルの構成要素

Last Update : January 02 2021 16:07:28

     

a. カーネル

1.カーネルとは

Linux OSの中核をなすソフトウェアのことで、以下の機能を持っています。

  • プロセス管理
    プロセス管理とは、アプリケーションプログラムの実行を許可し、ハードウェアへのアクセスのためのインタフェースをプログラムに提供することである。プログラムを実行するため、カーネルはプログラムのコードを含むファイルをメモリに読みこみ、プログラム実行に必要な専用領域(スタックと呼ぶ)を準備し、そのプログラムの所定の位置へ制御を渡すことで実行を開始する。
  • メモリ管理
    カーネルはアプリケーションプログラムの要求に応じて、安全なメモリアクセスを提供している。これは仮想アドレッシングと呼ばれる方式であり、この方式ではカーネルは物理アドレスを別のアドレス(仮想アドレス)に変換する。アプリケーションプログラムは仮想アドレスから始まるメモリ空間を自分のための空間と捕らえ、個々のプログラムが互いに他のプログラムのメモリ空間を破壊することを防止している。
  • 時間管理
  • 割込み管理
  • ファイル管理
    ファイル管理(ファイルシステム)は、コンピュータの資源を管理するための、OS が持つ機能の1つである。ファイルとは、ハードディスクなどの補助記憶装置に格納されたデータを示している。
  • ネットワーク管理
  • デバイス管理
    コンピュータに接続された周辺機器にアクセスするためには、カーネルを介してデバイスドライバを使用し、アクセスを行う。起動時、カーネルは最初に様々なバス(PCI や USB)上をチェックして実装された周辺機器(デバイス)を検出し、対応するドライバを探す。カーネルの設計によってドライバの扱い方は異なるが、一般にカーネルはドライバが物理的にデバイスにアクセスするための入出力ポートやメモリ空間を用意する。

カーネルは、コンピュータが起動したときに一番最初に動作するプログラムです。カーネルは、コンピュータのさまざまなハードウエアを初期化し、アプリケーションの動作環境を整えます。しかしそのあとは、カーネルは何もしない状態になります。なぜなら、カーネルはアプリケーションが動作するための補助的な仕事をしますので、自発的に動作をする必要がほとんどないからです。後述するアプリケーションからのシステム・コールやハードウエアからの割り込み信号などにより動作する、イベント駆動型のソフトウエアなのです。

2.カーネルのバージョン

● カーネルのバージョン番号の読み方

現在のカーネルのバージョン番号は、4段階になっています。
「2.x.y-x」というように、4つの番号がついています。
たとえば、「Red Hat Enterprise Linux 6」のカーネルバージョン番号は、「2.6.32-279.el6」です。
この場合、1番目の「2」がメジャー番号になります。
ちなみに、現在は「3」が最新バージョンです。
次の「6」が、マイナーバージョン番号になります。
かつては、この2番目の数字が偶数のものが「安定板」、奇数のものが「開発版」でしたが、現在は、関係なくなっています。
そして、3番目の数字が、「リビジョン」番号になります。リビジョン番号は、新しい「機能」が追加されたときに上がります。
4番目は「パッチレベル」の番号になります。パッチ修正ごとに数字が上がっていきます。
ということは、「2.6.32-279.el6」は、 パッチレベルは279です。
しかし、「2.6.32-279.el6」には、5つも数字があります。
この5番目の数字は、ディストリビュータが付けた番号だと思ってください。
たとえば、Redhat Enterprise Linux6 には「el6」、 Redhat Enterprise Linux5 には「el5」と付けていますし、
SUSE Linux Enterprise Server 11なら、「2.6.32.59-0.7.1」などと付けられています。
基本的に、カーネルバージョン番号は、4番目までです。

● カーネルバージョンの確認方法
カーネルバージョンの確認方法はいくつかあります。

  • uname -a
  • uname -r
  • cat /proc/version

の3つです。
他にも、カーネルソースからコンパイルしたカーネルを使用している場合、カーネルのMakefileを見ると分かります。
Makefileは、カーネルソースがインストールされているディレクトリにあります。


b. カーネルイメージ

カーネルイメージとは、Linuxカーネルを格納して圧縮したファイルであり、通常は /bootディレクトリ内にvmlinuzというファイル名で、配置されています。
コンピュータで実行可能な形式のカーネルを格納しているファイルです。
IA-32(32ビットのx86またはその互換環境)用のカーネル・イメージは「ブート・コード」「セットアップ・ルーチン」「圧縮カーネル」という3パートで構成されます。

  1. ブート・コードは、フロッピ・ディスクからLinuxを起動するための専用プログラムです。通常は、ハード・ディスクに書き込まれたブート・ローダーを利用してカーネルを起動するため、このブート・コードはほとんど使用されません。この部分はセクタサイズと同じ512Byteとなる。カーネル2.6では、フロッピーからの直接起動は未サポートとなっており、bootsect.oもエラーメッセージを出力するだけとなっている。
  2. セットアップ・ルーチンには、圧縮されたカーネルを展開するためのプログラムが格納されています。カーネルは、gzipを用いて圧縮されているので、このセットアップ・ルーチンによる展開処理が必要になります。
  3. 圧縮カーネルは、その名の通り、gzipを用いて圧縮されたカーネルです。

【 vmlinuz-xxxx の構成 】

bootsectsetupvmlinux.out

bootsect : ブートコード。フロッピーディスク用のブートコード。 512 バイト固定。 通常ほとんど使われない。
setup : セットアップ・ルーチン。デバイスの初期化、プロテクト モードへの移行を行う。
ファイルサイズはセクタサイズ (512 バイト) 単位に調整され、セクタ数は bootsect の 497 バイト目に記録される。
vmlinux.out : 圧縮カーネル。gzip 形式で圧縮済みのカーネル本体。 自己解凍 (展開) コードを含んでいる。

カーネル・イメージはハード・ディスク上の/bootディレクトリに格納されています。「vmlinuz-〈バージョン番号〉」などのファイル名が付けられています。システム起動時に、ブート・ローダー(またはブート・コード)により/bootディレクトリからメモリー上に読み込まれます。読み込まれた後に、圧縮カーネルが展開され、カーネルの起動処理が開始します。

カーネルには「zImage形式」と「bzImage形式」があり、カーネルをコンパイルするときに「make bzImage」などと指定します。 それぞれの違いは

  • PC AT互換機では OS やアプリケーションが自由に利用できるメモリーは640Kバイトに限られていた
    zImageは,この640Kバイトのメモリー領域に圧縮カーネルを読み込むことを念頭に開発された形式
    圧縮カーネルの最大サイズが512Kバイト以下に制限されています。
  • bzImage は最近の PC AT 互換機が塔載する拡張BIOS命令を使って,1Mバイトを超えるメモリー領域に直接圧縮カーネル・イメージを読みこむことができる。
  • zImage形式は一般には使わないが、古いBIOSを塔載する機種では,bzImageに非対応なものもあるため zImage 形式も依然サポートされている


c. カーネルモジュール

カーネルモジュールとは、カーネルの機能を拡張するためのバイナリファイルです。

  • カーネルの機能を分割し、必要に応じて部品のように動的に組み込める
  • それによりカーネルの肥大化を防ぎ、システムリソースの消費を抑えることができる

カーネル・モジュールとは、通常のアプリケーション・プログラムのように「ユーザー空間」で動くのではなく、「カーネル空間」で動くタイプのプログラム・モジュールです
現在のLinuxカーネルはモジュール形式で設計されています。起動時に最小限度の常駐カーネルだけがメモリにロードされ、必要に応じてモジュールのロードアンロードできるようになっています。ユーザーがカーネルに存在しない機能を要求すると、ドライバ・モジュールが動的にメモリにロードされます。 このため、常に使用するわけではないデバイスのためにメモリを消費することを防ぐことができます。

カーネルモジュールはカーネルのバージョンごとに用意する必要があります。
通常は、 /lib/modules/カーネルバージョン ディレクトリ以下に機能別のサブディレクトリ毎に格納され、.o という拡張子が付けられます。

  カーネルモジュールの設定ファイル:/etc/modules.confです。
(一部のディストリビューションでは /etc/conf.modules )
カーネルモジュールの別名や、起動時に渡すオプション情報、モジュールを組み込む順序などが記録されています。

  カーネルモジュールの依存関係が記述:modules.dep
あるモジュールを利用するために必要になるモジュールがある場合、依存関係にあるという表現を使います。
このファイルの内容を更新するには depmod -a コマンドを実行します。
(システム起動時やランレベル変更時には自動的に実行される)

カーネル・モジュールを読み込ませるには、「insmod」あるいは「modprobe」コマンドを使います。削除するには「rmmod」コマンドを使います。
自分が使っているLinuxにどんなカーネル・モジュールが読み込まれているか知りたい場合には「lsmod」コマンドを使います。「/sbin/lsmod」のようにコマンドを実行すれば(root権限が必要)、一覧が表示されます。 


z. 出題範囲概要

概要 :
  • 特定のハードウェア、ハードウェアドライバ、システムリソース、およびさまざまな要求に必要となるカーネルの構成要素を利用する。これには、異なる種類のカーネルイメージを実装すること、安定版および開発版のカーネルとパッチを区別すること、カーネルモジュールを利用することなども含まれる。

詳細 :
  • Kernel の配布形式。
    bzImage , xz データ圧縮
  • Kernelのモジュールとドキュメント。
    /usr/src/linux/
    /usr/src/linux/Documentation/

  [ 例題 ] 


         

    www.it-shikaku.jp